package com.yanfan.energy.mapper;

import com.yanfan.energy.domain.EquipmentConsumptionDto;
import com.yanfan.energy.domain.OverallEnergy;
import com.yanfan.energy.domain.statist.DateByStatistics;
import com.yanfan.energy.domain.statist.DateStatistics;
import org.apache.ibatis.annotations.Param;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Repository;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 能源总表(OverallEnergy)表数据库访问层
 *
 * @author makejava
 * @since 2022-09-26 13:57:15
 */
@Repository
public interface OverallEnergyDao {

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    OverallEnergy queryById(Integer id);

    /**
     * 查询指定行数据
     *
     * @param overallEnergy 查询条件
     * @param pageable      分页对象
     * @return 对象列表
     */
    List<OverallEnergy> queryAllByLimit(OverallEnergy overallEnergy, @Param("pageable") Pageable pageable);

    /**
     * 统计总行数
     *
     * @param overallEnergy 查询条件
     * @return 总行数
     */
    long count(OverallEnergy overallEnergy);

    /**
     * 新增数据
     *
     * @param overallEnergy 实例对象
     * @return 影响行数
     */
    int insert(OverallEnergy overallEnergy);

    /**
     * 批量新增数据（MyBatis原生foreach方法）
     *
     * @param entities List<OverallEnergy> 实例对象列表
     * @return 影响行数
     */
    int insertBatch(@Param("entities") List<OverallEnergy> entities);

    /**
     * 批量新增或按主键更新数据（MyBatis原生foreach方法）
     *
     * @param entities List<OverallEnergy> 实例对象列表
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常，请自行校验入参
     */
    int insertOrUpdateBatch(@Param("entities") List<OverallEnergy> entities);

    /**
     * 修改数据
     *
     * @param overallEnergy 实例对象
     * @return 影响行数
     */
    int update(OverallEnergy overallEnergy);

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 影响行数
     */
    int deleteById(Integer id);

    /**
     * 根据时间删
     *
     * @param time
     */
    void deleteByCreatdateandEquipment(@Param("time") String time, @Param("id") String id);

    /**
     * 按设备编号查找
     *
     * @param id
     * @return
     */
    OverallEnergy selectBySerialNumber(String id);

    /**
     * 能耗统计（万元）
     *
     * @param datetime
     * @param workshopId
     * @param deviceId
     * @param begin
     * @param end
     * @return java.util.List<io.github.jhipster.sample.sansheng.tool.statistics.DateByStatistics>
     * @author caijinkang
     * @date 2022/10/27 13:09
     */
    List<DateByStatistics> findConsumeEnergy(@Param("datetime") String datetime, @Param("workshopId") Integer workshopId, @Param("deviceId") Long deviceId, @Param("begin") LocalDate begin, @Param("end") LocalDate end);

    /**
     * 能耗统计（能耗）
     *
     * @param datetime
     * @param workshopId
     * @param deviceId
     * @param begin
     * @param end
     * @return java.util.List<io.github.jhipster.sample.sansheng.tool.statistics.DateByStatistics>
     * @author caijinkang
     * @date 2022/10/27 13:09
     */
    List<DateByStatistics> findConsumeEnergyByUnit(@Param("datetime") String datetime, @Param("workshopId") Integer workshopId, @Param("deviceId") Long deviceId, @Param("begin") LocalDate begin, @Param("end") LocalDate end);


    /**
     * 四种电统计（电的能耗kw/h）
     *
     * @param datetime
     * @param workshopId
     * @param energyId
     * @param begin
     * @param end
     * @return java.util.List<io.github.jhipster.sample.sansheng.tool.statistics.DateByStatistics>
     * @author caijinkang
     * @date 2022/10/27 13:09
     */
    List<DateByStatistics> findConsumeElectricity(@Param("datetime") String datetime, @Param("workshopId") Integer workshopId, @Param("energyId") Integer energyId, @Param("begin") LocalDate begin, @Param("end") LocalDate end);


    /**
     * 查询自来水及软化水的能耗
     *
     * @param datetime
     * @param workshopId
     * @param begin
     * @param end
     * @return java.util.List<io.github.jhipster.sample.sansheng.tool.statistics.DateStatistics>
     * @author caijinkang
     * @date 2022/10/27 17:23
     */
    List<DateStatistics> findConsumeWaterByUnit(@Param("datetime") String datetime, @Param("workshopId") Integer workshopId, @Param("floorId") Integer floorId, @Param("buildingId") Integer buildingId, @Param("begin") LocalDate begin, @Param("end") LocalDate end);

    /**
     * 查询自来水及软化水的能耗，加入了设备条件
     *
     * @param datetime   时间格式
     * @param workshopId 车间id
     * @param buildingId 楼栋id
     * @param deviceId   设备id
     * @param userId     用户id
     * @param tenantId   租户id
     * @param begin      开始时间
     * @param end        结束时间
     * @return java.util.List<com.ruoyi.common.core.domain.model.DateStatistics>
     * @author caijinkang
     * @date 2023/3/24 15:16
     */
    List<DateStatistics> findConsumeWaterByUnitAndDevice(@Param("datetime") String datetime, @Param("workshopId") Integer workshopId, @Param("buildingId") Integer buildingId, @Param("deviceId") Integer deviceId, @Param("userId") Integer userId, @Param("tenantId") Integer tenantId, @Param("begin") LocalDate begin, @Param("end") LocalDate end);


    /**
     * 查询自来水及软化水的万元价格
     *
     * @param datetime
     * @param workshopId
     * @param begin
     * @param end
     * @return java.util.List<io.github.jhipster.sample.sansheng.entity.DateStatistics>
     * @author caijinkang
     * @date 2022/10/27 17:04
     */
    List<DateStatistics> findConsumeWater(@Param("datetime") String datetime, @Param("workshopId") Integer workshopId, @Param("floorId") Integer floorId, @Param("buildingId") Integer buildingId, @Param("begin") LocalDate begin, @Param("end") LocalDate end);

    /**
     * 查询自来水及软化水的万元价格，加入了设备条件
     *
     * @param datetime
     * @param workshopId
     * @param buildingId
     * @param deviceId
     * @param userId
     * @param tenantId
     * @param begin
     * @param end
     * @return java.util.List<com.ruoyi.common.core.domain.model.DateStatistics>
     * @author caijinkang
     * @date 2023/3/24 15:29
     */
    List<DateStatistics> findConsumeWaterAndDevice(@Param("datetime") String datetime, @Param("workshopId") Integer workshopId, @Param("buildingId") Integer buildingId, @Param("deviceId") Integer deviceId, @Param("userId") Integer userId, @Param("tenantId") Integer tenantId, @Param("begin") LocalDate begin, @Param("end") LocalDate end);

    /**
     * 设备能耗
     *
     * @param buildingId
     * @param workshopIds
     * @param deviceIds
     * @param classifyId
     * @param deviceName
     * @param begin
     * @param end
     */
    List<EquipmentConsumptionDto> selectequipmentEnergy(@Param("buildingId") Long buildingId, @Param("workshopIds") List<Integer> workshopIds, @Param("deviceIds") List<Integer> deviceIds, @Param("classifyId") Integer classifyId, @Param("deviceName") String deviceName, @Param("begin") String begin, @Param("end") String end, @Param("floor") Integer floor, @Param("categoryId") Integer categoryId);


    List<EquipmentConsumptionDto> selectequipmentEnergyAll(@Param("buildingId") Long buildingId, @Param("workshopIds") List<Integer> workshopIds, @Param("deviceIds") List<Integer> deviceIds, @Param("classifyId") Integer classifyId, @Param("deviceName") String deviceName, @Param("begin") String begin, @Param("end") String end, @Param("floor") Integer floor);

    List<EquipmentConsumptionDto> energyByWorkShop(@Param("buildingId") Long buildingId, @Param("workshopIds") List<Integer> workshopIds, @Param("deviceIds") List<Integer> deviceIds, @Param("classifyId") Integer classifyId, @Param("deviceName") String deviceName, @Param("begin") String begin, @Param("end") String end, @Param("floor") Integer floor);

    List<EquipmentConsumptionDto> buildingByWorkShop(@Param("buildingId") Long buildingId, @Param("workshopIds") List<Integer> workshopIds, @Param("deviceIds") List<Integer> deviceIds, @Param("classifyId") Integer classifyId, @Param("deviceName") String deviceName, @Param("begin") String begin, @Param("end") String end, @Param("floor") Integer floor);


    /**
     * 设置小时表的数据导入到天表中
     *
     * @return java.lang.Integer
     * @author caijinkang
     * @date 2022/11/10 18:38
     */
    Integer setDayEnergyByHourEnergy();

    /**
     * 查询能耗每个月的省钱金额
     *
     * @param beginDate
     * @param endDate
     * @return java.util.List<com.ruoyi.common.core.domain.model.DateStatistics>
     * @author caijinkang
     * @date 2023/5/9 11:42
     */
    List<DateStatistics> findToMonthByCostSavings(@Param("beginDate") String beginDate, @Param("endDate") String endDate);

    /**
     * 查询能耗每天的省钱金额
     *
     * @param beginDate
     * @param endDate
     * @return java.util.List<com.ruoyi.common.core.domain.model.DateStatistics>
     * @author caijinkang
     * @date 2023/5/10 16:29
     */
    List<DateStatistics> findToDayByCostSavings(@Param("beginDate") String beginDate, @Param("endDate") String endDate);

    /**
     * 查询采购的省钱标准金额
     *
     * @param beginDate
     * @param endDate
     * @return java.util.List<com.ruoyi.common.core.domain.model.DateStatistics>
     * @author caijinkang
     * @date 2023/5/10 10:58
     */
    List<DateStatistics> findToMonthByCostPurchase(@Param("beginDate") String beginDate, @Param("endDate") String endDate);

    /**
     * 查询某个月采购的金额
     *
     * @param beginDate
     * @param endDate
     * @param forDate
     * @return java.util.List<com.ruoyi.common.core.domain.model.DateStatistics>
     * @author caijinkang
     * @date 2023/5/11 11:06
     */
    Double findDayByPurchase(@Param("beginDate") String beginDate, @Param("endDate") String endDate, @Param("forDate") String forDate);

    /**
     * 根据开始时间到结束时间找省钱标准金额（月）
     *
     * @param beginDate
     * @param endDate
     * @return java.lang.Double
     * @author caijinkang
     * @date 2023/5/11 13:58
     */
    Double findMonthBySaveMoney(@Param("beginDate") String beginDate, @Param("endDate") String endDate);

    /**
     * 根据开始时间到结束时间找省钱标准金额（日）
     *
     * @param beginDate
     * @param endDate
     * @return java.lang.Double
     * @author caijinkang
     * @date 2023/5/11 14:02
     */
    Double findDayBySaveMoney(@Param("beginDate") String beginDate, @Param("endDate") String endDate);


    List<OverallEnergy> queryEnergyConsumption(Map reqMap);

    void insertBeforeClear(Map reqMap);

    /**
     * 批量新增或按主键更新数据（MyBatis原生foreach方法）
     *
     * @param data OverallEnergy 需要新增的能源数据
     * @return 影响行数
     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常，请自行校验入参
     */
    int insertOrUpdateBatch2(@Param("data") OverallEnergy data, @Param("dateType") Integer dateType);

    void insertOrUpdateAllData(@Param("data") OverallEnergy overallEnergy, @Param("dateType") Integer dateType);

    List<OverallEnergy> queryEnergyConsumptionFull(Map reqMap);

}

